// 登录-->账号密码生产token-->前端保存到本地-->请求时通过请求头传递token
// jwt组成部分Header（头部）,Payload(有效荷载)，Signature(签名)
// 通过‘.’分隔  payload部分是真正的用户信息

// jsonwebtoken  用于生成jwt字符串
// express-jwt   将jwt字符串解析还原成JSON对象

const express = require('express')

const router = require('./05.apiRouter')

const app = express()

// 解析请求体数据
app.use(express.json())
app.use(express.urlencoded({ extended: false }))

// jwt
const jwt = require('jsonwebtoken')
const expressJwt = require('express-jwt')


// secret密钥
const secretKey = 'zhoushihao ddup ^_^'

// 将jwt字符串解析还原成JSON对象  unless()配置不需要访问权限的接口
// 解析出来的用户信息挂载到req.user中
app.use(expressJwt({ secret: secretKey }).unless({
    path: [/^\/api\//]
}))


// 生成token
app.post('/token', (req, res) => {
    // 登录成功之后，调用jwt.sign()方法生成jwt字符串
    // 参数1:用户的信息对象   参数2：加密的密钥  参数3：配置对象，配置token的有效期
    // 千万不要把密码加密到token中
    const tokenStr = jwt.sign({ username: userInfo.username }, secretKey, { expiresIn: '24h' })

    res.send({
        status: 200,
        message: 'success',
        token: tokenStr
    })
})

// 
// 一定要在路由之前配置cors中间件，解决接口跨域问题
const cors = require('cors')
app.use(cors())


app.use('/api', router)
// 
app.use((err, req, res, next) => {
    if (err.name === 'UnauthorizedError') {
        // token解析失败
        return res.send({
            status: 401,
            message: '无效token'
        })
    }
    res.send({
        status: 500,
        message: '错误'
    })
})
app.listen(3030, () => {
    console.log('服务器已启动 http://localhost:3030')
})